home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / telecomm / bbs / bbbbs84.lha / rexx / bbsFile.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1994-12-26  |  40.0 KB  |  1,660 lines

  1. /* $VER: bbsFile.rexx 8.3 (26.12.94)
  2. Copyright © 1994 Richard Lee Stockton
  3. BBBBS local file manager
  4. FREELY DISTRIBUTABLE
  5. */
  6.  
  7. SIGNAL ON BREAK_C
  8. SIGNAL ON BREAK_E
  9.  
  10. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  11. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  12.  
  13. IF GETCLIP('BBS_UPLOAD')~='' THEN
  14.   DO
  15.     SAY 'Uploading is temporarily suspended while the filelists are rebuilding.'
  16.     EXIT
  17.   END
  18.  
  19. ARG name pw
  20. CALL OPENPORT('BBSFILE')
  21. CALL PRAGMA('P',-1)
  22. title.=''
  23. title.1='BBBBS File Manager'
  24. title.2='Version 8.3'
  25. title.3='26-Dec-94'
  26. def=''
  27. pen3=''
  28. lineup='1B'x'M'
  29. files.=''
  30. files.0=0
  31. dlist=''
  32. numlist=''
  33. newlist.=''
  34. newlist.0=0
  35. savefileflag=0
  36. linesperpage=20
  37. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  38.  
  39. topath='RAM:'
  40. figarg='s:CONFIG.BBS'
  41. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  42. x=OPEN(f,figarg,'R')
  43. IF x=0 THEN
  44.   DO
  45.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  46.     EXIT
  47.   END
  48. lynes.=''
  49. DO i=1 TO 40
  50.   lynes.i=READLN(f)
  51. END
  52. CALL CLOSE(f)
  53.  
  54. compos=POS('/*',lynes.1)
  55. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  56. bbsname=STRIP(lynes.1)
  57. sysop=WORD(lynes.2,1)
  58. compos=POS('/*',lynes.3)
  59. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  60. bbsdevice=word(lynes.4,1)
  61. sysoplevel=WORD(lynes.5,1)
  62. bbspath=WORD(lynes.6,1)
  63. IF ~EXISTS(bbspath) THEN
  64.   DO
  65.     SAY bbspath 'does not exist!'
  66.     EXIT
  67.   END
  68. testchar=RIGHT(bbspath,1)
  69. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  70. libpath=WORD(lynes.8,1)
  71. IF ~EXISTS(libpath) THEN
  72.   DO
  73.     SAY libpath 'does not exist!'
  74.     EXIT
  75.   END
  76. testchar=RIGHT(libpath,1)
  77. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  78. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  79. ELSE scratch='RAM:Scratch'
  80. CALL MAKEDIR(scratch)
  81. extension=WORD(lynes.32,1)
  82. compos=POS('/*',lynes.33)
  83. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  84. arccom=STRIP(lynes.33)
  85. IF LEFT(extension,1)~='.' THEN
  86.   DO
  87.     extension='.lzh'
  88.     arccom='lharc -m m'
  89.   END
  90.  
  91. IF name='' THEN
  92.   DO
  93.     OPTIONS PROMPT ' Are you 'sysop'? (Yn) > '
  94.     PULL answer
  95.     IF answer='N' THEN
  96.       DO
  97.         SAY
  98.         OPTIONS PROMPT ' Please enter your name > '
  99.         PULL name
  100.         name=cleanstring('1:'name)
  101.         IF name='' THEN EXIT 
  102.       END
  103.     ELSE name=sysop
  104.   END
  105. IF ~EXISTS(bbspath'Users/'name) THEN
  106.   DO
  107.     SAY name 'does not exist!'
  108.     EXIT
  109.   END
  110.  
  111. CALL loaddata()
  112. IF pw~=password THEN
  113.   DO
  114.     passprompt=pen3' Please Enter Password: '
  115.     DO tries=1 TO 3
  116.       OPTIONS PROMPT passprompt
  117.       PULL newpassword
  118.       SAY def
  119.       IF(password=newpassword) THEN LEAVE tries; /* correct password */
  120.       IF tries=3 THEN
  121.         DO
  122.           SAY 
  123.           SAY 'Access terminated.'
  124.           SAY '*** Bad password ***' newpassword '***'
  125.           EXIT
  126.         END
  127.       passprompt='Incorrect.  Password: ' /* ask again */
  128.     END
  129.     SAY
  130.     SAY' OK, 'name' here we go....'
  131.     SAY
  132.   END
  133.  
  134. dirs.=''
  135. IF readopen(bbspath'Lists/Libraries') THEN
  136.   DO
  137.     SAY 'Loading library list...'
  138.     DO i=1
  139.       line=READLN(f)
  140.       IF line='END' | EOF(f) THEN LEAVE i
  141.       num=WORD(line,1)
  142.       IF DATATYPE(num,'W') THEN
  143.         DO
  144.           IF num>level THEN ITERATE i
  145.           dirs.num=STRIP(WORD(line,2))
  146.         END
  147.     END
  148.     CALL CLOSE(f)
  149.     CALL sortlibraries()
  150.   END
  151. SAY
  152.  
  153. uloadflag=0
  154. DO loop=1
  155.   SAY
  156.   DO i=1 TO 3
  157.     SAY CENTER(title.i,34)
  158.   END
  159.   SAY
  160.   SAY '        1. Add Files'
  161.   SAY '        2. Add FileNote (file already exists)'
  162.   SAY '        3. Browse'
  163.   SAY '        Q. Quit'
  164.   SAY
  165.   OPTIONS PROMPT 'Select: '
  166.   PULL temp
  167.   IF temp='Q' THEN LEAVE loop
  168.   ELSE IF temp=1 THEN
  169.     DO subloop=1
  170.       IF uload()>1 THEN LEAVE subloop
  171.     END
  172.   ELSE IF temp=2 THEN
  173.     DO
  174.       IF chdir()=0 THEN
  175.         DO
  176.           rfiles=SHOWDIR(libpath||dirs.dirnum)
  177.           rnotes=SHOWDIR(bbspath'FileNotes/'dirs.dirnum)
  178.           IF WORDS(rfiles)~=WORDS(rnotes) THEN
  179.             DO
  180.               DO j=1 TO WORDS(rfiles)
  181.                 IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  182.                   DO
  183.                     arg=WORD(rfiles,j)
  184.                     CALL DELETE(libpath||dirs.dirnum'/.'STRIP(LEFT(dirs.dirnum,15)))
  185.                     IF testfile()=0 THEN CALL editnote()
  186.                   END
  187.               END
  188.             END
  189.         END
  190.     END
  191.   ELSE IF temp=3 THEN CALL browse()
  192.   IF dlist~='' THEN
  193.     DO
  194.       ab=0
  195.       cpy=1
  196.       SAY
  197.       IF WORD(STATEF(todir),1)='DIR' THEN
  198.         IF getinput(1 1 'Copy filelist to' todir '? (nY) > ')='N' THEN ab=1
  199.       ELSE ab=1
  200.       IF ab THEN
  201.         IF ~pickdir() THEN cpy=0
  202.       IF cpy THEN
  203.         DO i=1 TO WORDS(dlist) WHILE cpy
  204.           CALL copyfile(WORD(dlist,i))
  205.         END
  206.       ELSE IF getinput(1 1 'Clear copylist? (nY) > ')~='N' THEN dlist=''
  207.     END
  208. END
  209.  
  210. IF newlist.0>0 THEN
  211.   DO
  212.     IF newlist.0>0 THEN CALL fileupdate()
  213.     IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
  214.     ELSE CALL SETCLIP('BBS_localfiles')
  215.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  216.     ELSE CALL SETCLIP('BBS_mainfiles')
  217.   END
  218.  
  219. EXIT
  220.  
  221.  
  222. /* SUBROUTINES */
  223.  
  224. sortlibraries:
  225. SAY 'Sorting Libraries...'
  226. count=0
  227. sdirs.=''
  228. DO i=1 TO level
  229.   IF dirs.i='' THEN ITERATE i
  230.   count=count+1
  231.   sdirs.count=dirs.i i
  232. END
  233. sdirs.0=count
  234. IF count>0 THEN CALL QSort(1,count,sdirs)
  235. count=0
  236. libs.=''
  237. DO i=1 TO sdirs.0
  238.   tempnum=WORD(sdirs.i,2)
  239.   tempdir=WORD(sdirs.i,1)
  240.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  241.     DO
  242.       string=' '
  243.       IF tempnum<10 THEN string=string' '
  244.       string=string || tempnum'. 'LEFT(tempdir,14)
  245.       count=count+1
  246.       libs.count=string
  247.     END
  248. END
  249. libs.0=count%4
  250. IF (count//4)>0 THEN libs.0=libs.0+1
  251. DO i=1 TO libs.0
  252.   DO j=1 TO 3
  253.     k=i+j*libs.0
  254.     IF k<=count THEN libs.i=libs.i||libs.k
  255.   END
  256. END
  257. DROP sdirs.
  258. RETURN
  259.  
  260.  
  261. bbsspace:
  262. ARG tabspace .
  263. ADDRESS COMMAND 'C:info >'scratch'/filinfout' bbsdevice
  264. ok=OPEN(f,scratch'/filinfout','R')
  265. IF ok=0 THEN RETURN 20
  266. line=READLN(f)
  267. line=READLN(f)
  268. line=READLN(f)
  269. line=READLN(f)
  270. CALL CLOSE(f)
  271. IF tabspace<14 THEN SAY 
  272. bbsk=WORD(line,4)
  273. IF ~DATATYPE(bbsk,'N') THEN
  274.   DO
  275.     line=bbsdevice 'is not an info compatible device!'
  276.     SAY pen3||line||def
  277.     bbsk=0
  278.     RETURN
  279.   END
  280. bbsk=bbsk*512
  281. IF bbsk<1 THEN bbsk=0
  282. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'
  283. RETURN
  284.  
  285.  
  286. comma: PROCEDURE
  287. ARG num .
  288. dgt=LENGTH(num)
  289. numtext=''
  290. IF dgt>3 THEN numtext=','RIGHT(num,3)
  291. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  292. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  293. IF dgt>12 THEN
  294.   DO
  295.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  296.     numtext=LEFT(num,dgt-12)||numtext
  297.   END
  298. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  299. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  300. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  301. ELSE numtext=num
  302. RETURN numtext
  303.  
  304.  
  305. is_here:
  306. ARG newname 
  307. SAY 'Checking filelist...'
  308. DO wi=1 TO 99
  309.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  310.   IF dirs.wi='' THEN ITERATE wi
  311.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  312.   line=pen3'*** File' newname 'already exists here'
  313.   IF wi<=level THEN line=line 'in the' dirs.wi 'library'
  314.   line=line'.'def
  315.   SAY line
  316.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'
  317.   CALL waiting()
  318.   RETURN 1
  319. END
  320. RETURN 0
  321.  
  322.  
  323. uload:
  324. CALL bbsspace(12)
  325. SAY
  326. IF bbsk<1 THEN
  327.   DO
  328.     SAY pen3'Upload area is full!'def
  329.     RETURN 2
  330.   END
  331. frompath=GETCLIP('BBS_frompath')
  332. IF frompath='' THEN frompath='RAM:'
  333. fdir=''
  334. DO loop=1
  335.   fromfile=GetFile(200,,frompath,'',' Select File to Upload ')
  336.   IF fromfile='' THEN RETURN 3
  337.   finfo=STATEF(fromfile)
  338.   IF WORD(finfo,1)='DIR' THEN RETURN 3
  339.   IF WORD(finfo,1)='FILE' THEN LEAVE loop
  340.   SAY
  341.   SAY fromfile 'does not exist!'
  342.   CALL DELAY(100)
  343. END
  344. x=LASTPOS('/',fromfile)
  345. IF x=0 THEN x=POS(':',fromfile)
  346. IF x>0 THEN
  347.   DO
  348.     arg=SUBSTR(fromfile,x+1)
  349.     fdir=LEFT(fromfile,x)
  350.     IF RIGHT(fdir,1)='/' THEN fdir=LEFT(fdir,x-1)
  351.     CALL SETCLIP('BBS_frompath',fdir)
  352.   END
  353. ELSE arg=fromfile
  354. arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')  /* be sure no illegals here */
  355. x=LASTPOS('/',fromfile)
  356. IF x=0 THEN x=LASTPOS(':',fromfile)
  357. IF x>0 THEN
  358.   DO
  359.     IF DATATYPE(SUBSTR(fromfile,x+1),'W') THEN
  360.       DO
  361.         SAY 'Numbers only are not allowed as filenames!'
  362.         CALL waiting()
  363.         RETURN 1
  364.       END
  365.   END
  366. size=WORD(STATEF(fromfile),2)
  367. IF ~DATATYPE(size,'W') THEN size='654321'
  368. tempnum=LENGTH(arg)+LENGTH(size)-22
  369. DO WHILE tempnum>0
  370.   temp='          'pen3||arg def'is'pen3 tempnum||def
  371.   IF tempnum=1 THEN temp=temp 'character'
  372.   ELSE temp=temp 'characters'
  373.   temp=temp 'too long for a filename.'
  374.   SAY temp  
  375.   arg=getinput(0 0 'Filename: ')
  376.   arg=cleanstring('0:'arg)
  377.   arg=COMPRESS(arg,' :/,;|#?*')
  378.   tempnum=LENGTH(arg)+LENGTH(size)-22
  379. END
  380. IF arg='' THEN RETURN 1
  381. IF is_here(arg) THEN RETURN 1
  382. SAY
  383. SAY 'Please select an appropriate library for -' pen3||arg def'-'
  384. IF chdir()>0 THEN RETURN 1
  385. SAY 'Working...'lineup
  386. ADDRESS COMMAND 'C:COPY' fromfile PRAGMA('D')'/'arg
  387. IF testfile() THEN RETURN 1
  388. CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  389. IF getinput(1 1 'Kill original file' fromfile '? (Ny) > ')='Y' THEN
  390.   DO
  391.     CALL DELETE(fromfile)
  392.     SAY 'Killed' fromfile'...'
  393.   END
  394. DO ui=sysoplevel+2 TO 100
  395.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0
  396. END
  397. DO WHILE editnote(bbspath'FileNotes/'plaindir'/'arg) /* INSIST on a filenote */
  398. END
  399. RETURN 0
  400.  
  401.  
  402. testfile:
  403. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  404.   DO
  405.     SAY
  406.     SAY pen3'***'def arg pen3'failed archive check!'def
  407.     SAY
  408.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  409.     IF temp~='Y' THEN
  410.       DO
  411.         CALL DELETE(arg)
  412.         SAY
  413.         RETURN 1
  414.       END
  415.   END
  416. RETURN 0
  417.  
  418.  
  419. editnote:
  420. IF arg='' THEN
  421.   DO
  422.     PARSE PULL arg .
  423.     IF arg='' THEN RETURN 0
  424.   END
  425. comment=''
  426. IF ~EXISTS(arg) THEN
  427.   DO
  428.     IF level<sysoplevel THEN RETURN 0
  429.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  430.     fromarg=arg
  431.     fromdir=GETCLIP('BBS_frompath')
  432.     IF WORDS(finfo)>7 THEN
  433.       DO
  434.         temp='Y'
  435.         fromdir=WORD(finfo,8)
  436.         fromdir=lastslash(fromdir)
  437.         fromarg=WORD(fromdir,1)
  438.         fromdir=WORD(fromdir,2)
  439.       END
  440.     ELSE temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  441.     IF fromdir='' THEN fromdir='RAM:'
  442.     IF temp='Y' THEN
  443.       DO WHILE comment=''
  444.         comment=GetFile(150,36,fromdir,fromarg,' Select Linked File ')
  445.         IF comment='' THEN RETURN 0
  446.         IF ~EXISTS(comment) THEN comment=''
  447.         ELSE CALL SETCLIP('BBS_frompath',WORD(lastslash(comment),2))
  448.       END
  449.     ELSE IF temp~='N' THEN RETURN 0
  450.   END
  451. filedir=plaindir
  452. slash=LASTPOS('/',arg)
  453. IF slash=0 THEN slash=LASTPOS(':',arg)
  454. IF slash>0 THEN
  455.   DO
  456.     filedir=LEFT(arg,slash-1)
  457.     filedir=SUBSTR(filedir,5)
  458.     arg=SUBSTR(arg,slash+1)
  459.   END
  460. ELSE filedir=plaindir
  461. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  462. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  463.   DO
  464.     SAY pen3'*** Failed to open directory!' filedir||def
  465.     RETURN 0
  466.   END
  467. notename=bbspath'FileNotes/'filedir'/'arg
  468. lynes.=''
  469. filenum=countcheck('Numbers/LastFile' 0)
  470. IF level>sysoplevel THEN firstedit=1
  471. ELSE firstedit=5
  472. IF EXISTS(notename) THEN
  473.   DO
  474.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  475.     CALL bbsED.rexx(firstedit notename name)
  476.     CALL readlines(notename 1)
  477.     CALL checkfilechanges()
  478.     RETURN 0
  479.   END
  480. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  481. ELSE filedata=STATEF(comment)
  482. IF filedata='' THEN
  483.   DO
  484.     IF comment='' THEN line=filedir'/'arg
  485.     ELSE line=comment
  486.     SAY line 'does not exist!'
  487.     RETURN 0
  488.   END
  489. bytes=WORD(filedata,2)
  490. filenum=filenum+1
  491. lynes.0=4
  492. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  493. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  494. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  495. lynes.4=LEFT('',74,'=')
  496. lynes.1=lynes.1 edkeywords(arg filedir)
  497. diz='RAM:file_id.diz'
  498. IF EXISTS(diz) THEN CALL readlines(diz 5)
  499. CALL DELETE(diz)
  500. CALL seelines(1)
  501. edtype=''
  502. CALL writebuffer(scratch'/NoteFile')
  503. IF savelines(notename) THEN RETURN 0
  504. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  505. CALL DELETE(libpath||filedir'/.'STRIP(LEFT(filedir,15)))
  506. fncom='R'
  507. DO WHILE fncom='R'
  508.   CALL seelines(1)
  509.   nonstop=0
  510.   line='['pen3'E'def']dit'
  511.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  512.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  513.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  514.   ELSE line=line '(erS) 'def
  515.   fncom=getinput(1 1 line)
  516.   IF fncom='K' & level>sysoplevel THEN
  517.     DO
  518.       SAY 'Killing FileNote..'
  519.       CALL DELETE(notename)
  520.       RETURN 1
  521.     END
  522.   ELSE IF fncom='E' THEN
  523.     DO
  524.       IF bbsED.rexx(firstedit notename name)>0 THEN RETURN 0
  525.       CALL readlines(notename 1)
  526.       CALL checkfilechanges()
  527.       fncom='R'
  528.     END
  529.   ELSE IF fncom~='R' THEN
  530.     DO
  531.       SAY 'Adjusting filelist...'
  532.       IF filenum<1 THEN filenum=1
  533.       IF GETCLIP('BBS_level')~='' THEN CALL SETCLIP('BBS_localfiles',1)
  534.       CALL countcheck('Numbers/LastFile' filenum)
  535.       IF files.0>0 THEN files.filenum=plaindir arg
  536.       IF EXISTS(bbspath'Lists/Files') THEN
  537.         x=OPEN(f,bbspath'Lists/Files','A')
  538.       ELSE x=OPEN(f,bbspath'Lists/Files','W')
  539.       IF x=0 THEN
  540.         DO
  541.           SAY '*** Failed to open' bbspath'Lists/Files'
  542.           RETURN 0
  543.         END
  544.       CALL WRITELN(f,filenum plaindir arg)
  545.       CALL CLOSE(f)
  546.       libnum=finddirnum(plaindir)
  547.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  548.       alpha=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  549.       alpha=alpha WORD(lynes.2,4) RIGHT(filenum,5)
  550.       alpha=alpha RIGHT(libnum,2) LEFT(plaindir,12)
  551.       alpha=alpha STRIP(LEFT(STRIP(keywords),32))
  552.       IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',1)
  553.       IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',1)
  554.       newlist.0=newlist.0+1
  555.       nl=newlist.0
  556.       newlist.nl=alpha
  557.       SAY alpha
  558.       tf=bbspath'Lists/Files.ALPHA.add'
  559.       IF EXISTS(tf) THEN ft='A'
  560.       ELSE ft='W'
  561.       x=OPEN(a,tf,ft)
  562.       IF x=0 THEN SAY 'Unable to open File.ALPHA.add for writing!'
  563.       ELSE
  564.         DO
  565.           CALL WRITELN(a,alpha)
  566.           CALL CLOSE(a)
  567.         END
  568.     END
  569. END
  570. RETURN 0
  571.  
  572.  
  573. edkeywords:
  574. PARSE ARG kwarg
  575. templine=''
  576. DO WHILE LENGTH(templine)<3
  577.   SAY
  578.   SAY pen3'Please enter a list of keywords (or a condensed description)'def
  579.   SAY pen3'to be used in the alphabetic list and by the search routine.'def
  580.   SAY '    Note that only the first 32 characters will be used.'
  581.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'
  582.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  583.   templine=cleanstring('0:'templine)
  584.   templine=STRIP(LEFT(templine,32))
  585.   SAY
  586. END
  587. RETURN templine
  588.  
  589.  
  590. savefilelist:
  591. xarg=bbspath'Lists/Files'
  592. CALL DELETE(xarg)
  593. filenum=countcheck('Numbers/LastFile' 0)
  594. IF filenum<1 | files.0<1 THEN RETURN
  595. IF ~writeopen(xarg) THEN RETURN
  596. SAY 'Saving filelist...'
  597. DO i=1 TO filenum
  598.   IF files.i='' THEN ITERATE
  599.   CALL WRITELN(f,i files.i)
  600. END
  601. CALL CLOSE(f)
  602. RETURN
  603.  
  604.  
  605. lastslash:
  606. PARSE ARG sarg 
  607. sdir=''
  608. slash=LASTPOS('/',sarg)
  609. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  610. ELSE
  611.   DO
  612.     slash=LASTPOS(':',sarg)
  613.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  614.   END
  615. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  616. RETURN sarg sdir
  617.  
  618.  
  619. cleanline:
  620. ARG lflag .
  621. cline=lineup||LEFT(' ',78)
  622. IF lflag=1 THEN cline=cline||lineup
  623. SAY cline
  624. RETURN
  625.  
  626.  
  627. countcheck:
  628. PARSE ARG fname' 'cknum' '.
  629. fname=bbspath||fname
  630. IF ~EXISTS(fname) THEN
  631.   DO
  632.     IF cknum=0 THEN RETURN 0
  633.     IF ~writeopen(fname) THEN RETURN 0
  634.     CALL WRITELN(f,cknum)
  635.     CALL CLOSE(f)
  636.     RETURN cknum
  637.   END
  638. IF ~readopen(fname) THEN RETURN cknum
  639. retval=STRIP(READLN(f))
  640. CALL CLOSE(f)
  641. IF ~DATATYPE(retval,'W') THEN retval=0
  642. IF ~DATATYPE(cknum,'W') THEN cknum=0
  643. IF retval<cknum THEN
  644.   DO
  645.     IF writeopen(fname) THEN
  646.       DO
  647.         CALL WRITELN(f,cknum)
  648.         CALL CLOSE(f)
  649.         RETURN cknum
  650.       END
  651.   END
  652. RETURN retval
  653.  
  654.  
  655. readopen:
  656. PARSE ARG fname
  657. ok=OPEN(f,fname,'R')
  658. IF ok~=0 THEN RETURN 1
  659. line=fname 'failed to open for reading!'
  660. SAY line
  661. RETURN 0
  662.  
  663.  
  664. writeopen:
  665. PARSE ARG fname
  666. CALL CLOSE(f)
  667. ok=OPEN(f,fname,'W')
  668. IF ok~=0 THEN RETURN 1
  669. line=fname 'failed to open for writing!'
  670. SAY line
  671. RETURN 0
  672.  
  673.  
  674. writebuffer:
  675. PARSE ARG bufname .
  676. CALL DELETE(bufname)
  677. startnum=lynes.0+1
  678. OPTIONS PROMPT ''
  679. SAY pen3'LOCAL logon! Input cannot exceed 250 characters per line!'def
  680. SAY 'Type 'pen3'/E'def 'or' pen3'/S'def' on a new line to exit and' pen3'DO YOUR OWN WORDWRAP!'def
  681. DO bufloop=startnum
  682.   PARSE PULL line
  683.   IF LEFT(UPPER(STRIP(line)),2)='/E' | LEFT(UPPER(STRIP(line)),2)='/S' THEN
  684.     LEAVE bufloop
  685.   lynes.bufloop=line
  686. END
  687. lynes.0=bufloop-1
  688. CALL wrapbuf(startnum)
  689. CALL DELETE(bufname)
  690. CALL savelines(bufname)
  691. CALL readlines(bufname 1)
  692. CALL wrapbuf(startnum)
  693. RETURN
  694.  
  695.  
  696. wrapbuf:
  697. ARG startnum .
  698. SAY pen3'Wordwrapping...'def
  699. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  700. lynes.startnum=COMPRESS(lynes.startnum,'0C'x)  /* no FF */
  701. DO wi=startnum WHILE wi<=lynes.0
  702.   wj=wi+1
  703.   lynes.wj=COMPRESS(lynes.wj,'08'x||'0C'x||'7F'x)
  704.   tabpos=POS('09'x,lynes.wi)
  705.   DO WHILE tabpos>0
  706.     lynes.wi=DELSTR(lynes.wi,tabpos,1)
  707.     lynes.wi=INSERT('  ',lynes.wi,tabpos-1)
  708.     tabpos=POS('09'x,lynes.wi)
  709.   END
  710.   IF LENGTH(lynes.wi)>75 THEN
  711.     DO
  712.       testchar=''
  713.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  714.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  715.         DO
  716.           DO wjj=lynes.0 TO wi+1 BY -1
  717.             wk=wjj+1
  718.             lynes.wk=lynes.wjj
  719.           END
  720.           lynes.wj=''
  721.           lynes.0=lynes.0+1
  722.         END
  723.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  724.         IF WORDS(lynes.wi)=1 THEN
  725.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  726.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  727.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  728.       END
  729.     END
  730. END
  731. RETURN
  732.  
  733.  
  734. seelines:
  735. DO i=1 TO lynes.0
  736.   SAY lynes.i||def
  737.   IF i//linesperpage=0 THEN
  738.     IF waiting2() THEN LEAVE i
  739. END
  740. nonstop=0
  741. RETURN
  742.  
  743.  
  744. readlines:
  745. CALL CLOSE(f)
  746. PARSE ARG tempname readstart .
  747. IF ~readopen(tempname) THEN RETURN 1
  748. IF readstart<2 THEN lynes.=''
  749. DO ri=readstart
  750.   line=READLN(f)
  751.   IF EOF(f) THEN BREAK
  752.   lynes.ri=line
  753. END
  754. lynes.0=ri-1
  755. CALL CLOSE(f)
  756. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),1)='/'
  757. END
  758. lynes.0=ri
  759. RETURN 0
  760.  
  761.  
  762. savelines:
  763. PARSE ARG tempname .
  764. ok=OPEN(f,tempname,'W')
  765. IF ok=0 THEN
  766.   DO
  767.     SAY '***' tempname 'failed to open for saving!'
  768.     RETURN 1
  769.   END
  770. DO wi=1 TO lynes.0
  771.   CALL WRITELN(f,lynes.wi)
  772. END
  773. CALL CLOSE(f)
  774. RETURN 0
  775.  
  776.  
  777. cleanstring:
  778. PARSE ARG nflag':'cstr
  779. IF nflag=1 THEN
  780.   DO
  781.     cstr=COMPRESS(cstr,"'`")
  782.     cstr=TRANSLATE(cstr,,namemask)
  783.     cstr=SPACE(cstr,1,'_')
  784.     RETURN cstr
  785.   END
  786. bot=XRANGE(,'1F'x)
  787. top=XRANGE('7F'x)
  788. cstr=COMPRESS(cstr,bot||top)
  789. IF nflag=0 THEN cstr=STRIP(cstr)
  790. RETURN cstr
  791.  
  792.  
  793. getinput:
  794. PARSE ARG upflag' 'oneflag' 'pline
  795. OPTIONS PROMPT pline
  796. PARSE PULL inarg
  797. inarg=STRIP(inarg)
  798. IF upflag THEN inarg=UPPER(inarg)
  799. IF oneflag THEN inarg=LEFT(inarg,1)
  800. RETURN inarg
  801.  
  802.  
  803. setdir:
  804. PARSE ARG tempdir
  805. CALL PRAGMA('D',STRIP(tempdir))
  806. plaindir=PRAGMA('D')
  807. slash=LASTPOS('/',plaindir)
  808. IF slash=0 THEN slash=LASTPOS(':',plaindir)
  809. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  810. RETURN
  811.  
  812.  
  813. waiting2:
  814. IF nonstop=1 THEN RETURN 0
  815. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  816. IF waitchar='N' THEN
  817.   DO
  818.     nonstop=1
  819.     SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def
  820.     SAY
  821.     CALL DELAY(100)
  822.     waitchar=''
  823.   END
  824. IF waitchar='Q' THEN RETURN 1
  825. RETURN 0
  826.  
  827.  
  828. showtext:
  829. PARSE ARG arg .
  830. IF EXISTS(arg) THEN
  831.   DO
  832.     CALL readlines(arg 1)
  833.     CALL seelines(1)
  834.     nonstop=0
  835.     CALL waiting()
  836.   END
  837. RETURN
  838.  
  839.  
  840. waiting:
  841. IF waitchar='Q' THEN
  842.   DO
  843.     waitchar=''
  844.     RETURN
  845.   END
  846. waitchar=''
  847. IF nonstop=1 THEN RETURN
  848. OPTIONS PROMPT pen3'                       RETURN=Continue  'def
  849. PULL waitchar
  850. RETURN
  851.  
  852.  
  853. finddirnum:
  854. ARG fdirname .
  855. DO fdir=1 TO 99
  856.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  857. END
  858. RETURN 100
  859.  
  860.  
  861. chdir:
  862. string=''
  863. SAY pen3||LEFT('-',75,'-')||def
  864. DO i=1 TO libs.0
  865.   SAY libs.i
  866. END
  867. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  868. IF clr~='' THEN Send clr
  869. IF ~DATATYPE(dirnum,'W') THEN
  870.   DO
  871.     waitchar=dirnum
  872.     RETURN 2
  873.   END
  874.  
  875. chdir2:
  876. IF dirnum<1 | dirnum>99 THEN
  877.   DO
  878.     waitchar=dirnum
  879.     RETURN 1
  880.   END
  881. IF dirs.dirnum='' THEN
  882.   DO
  883.     SAY pen3'That library number is currently un-assigned.'def
  884.     RETURN 1
  885.   END
  886. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  887.   DO
  888.     SAY pen3'You do not have authorization for that library!'def
  889.     RETURN 1
  890.   END
  891. CALL MAKEDIR(libpath||dirs.dirnum)
  892. CALL setdir(libpath||dirs.dirnum)
  893. t=libpath||plaindir'.txt'
  894. IF ~EXISTS(t) THEN RETURN 0
  895. nonstop=1
  896. SAY
  897. CALL readlines(t 1)
  898. CALL seelines(1)
  899. SAY
  900. nonstop=0
  901. RETURN 0
  902.  
  903.  
  904. fileupdate:
  905. IF savefileflag THEN CALL savefilelist()
  906. CALL checkliblists()
  907. IF newlist.0>1 THEN CALL QSort(1,newlist.0,newlist)
  908. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA','R') THEN
  909.   DO
  910.     SAY 'Files.ALPHA failed to open for reading!'
  911.     RETURN
  912.   END
  913. CALL CLOSE(a)
  914. tf=bbspath'Lists/Files.ALPHA.temp'
  915. IF EXISTS(tf) THEN CALL DELETE(tf)
  916. CALL RENAME(bbspath'Lists/Files.ALPHA',tf)
  917. IF ~listOPEN(f,tf,'R') THEN
  918.   DO
  919.     SAY 'Unable to open Files.ALPHA.temp for reading!'
  920.     RETURN
  921.   END
  922. IF ~listOPEN(a,bbspath'Lists/Files.ALPHA','W') THEN
  923.   DO
  924.     SAY 'Unable to open Files.ALPHA for writing!'
  925.     RETURN
  926.   END
  927. nl=1
  928. totfiles=0
  929. SAY 'Writing new alphabetical filelists...'
  930. DO i=1
  931.   line=READLN(f)
  932.   IF EOF(f) THEN LEAVE i
  933.   filenum=WORD(line,3)
  934.   IF files.0>0 THEN
  935.     DO
  936.       IF DATATYPE(filenum,'W') & files.filenum='' THEN
  937.         DO
  938.           SAY 'Deleted:' WORD(line,1)
  939.           ITERATE i
  940.         END
  941.       DO j=1 TO WORDS(numlist)
  942.         IF filenum=WORD(numlist,j) THEN
  943.           DO
  944.             CALL STRIP(DELWORD(numlist,j,1))
  945.             SAY 'Changed:' WORD(line,1)
  946.             ITERATE i
  947.           END
  948.       END
  949.     END
  950.   IF nl<=newlist.0 THEN
  951.     DO WHILE (UPPER(newlist.nl)<UPPER(line)) & (nl<=newlist.0)
  952.       SAY newlist.nl
  953.       CALL WRITELN(a,newlist.nl)
  954.       CALL updateliblists(newlist.nl)
  955.       totfiles=totfiles+1
  956.       nl=nl+1
  957.     END
  958.   CALL WRITELN(a,line)
  959.   CALL updateliblists(line)
  960.   totfiles=totfiles+1
  961. END
  962. totfiles=totfiles+newlist.0-nl-1
  963. DO i=nl TO newlist.0
  964.   CALL WRITELN(a,newlist.i)
  965.   CALL updateliblists(newlist.i)
  966. END
  967. CALL CLOSE(a)
  968. CALL CLOSE(f)
  969. CALL closeliblists()
  970. CALL DELETE(tf)
  971. CALL DELETE(bbspath'Lists/Files.ALPHA.add')
  972. CALL bbsALPHA.rexx(totfiles SUBSTR(extension,2) arccom)
  973. RETURN
  974.  
  975.  
  976. listOPEN:
  977. PARSE ARG fh,listfile,flag
  978. CALL CLOSE(fh)
  979. DO i=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  980.   IF i//4=0 THEN SAY 'Waiting' (60-i)*5 'more seconds for' listfile 'to become available...'
  981.   CALL DELAY(250)
  982. END
  983. IF i>59 THEN
  984.   DO
  985.     SAY '*** unable to access' listfile 'list.'
  986.     RETURN 0
  987.   END
  988. RETURN 1
  989.  
  990.  
  991. checkliblists:
  992. SAY 'Checking individual library filelists...'
  993. liblist=''
  994. lastlib=0
  995. cnt.=0
  996. dirs.=''
  997. IF ~listOPEN(f,bbspath'Lists/Libraries','R') THEN RETURN
  998. DO i=1
  999.   line=READLN(f)
  1000.   IF EOF(f) THEN LEAVE i
  1001.   num=WORD(line,1)
  1002.   IF ~DATATYPE(num,'W') THEN ITERATE i
  1003.   dirs.num=WORD(line,2)
  1004.   finfo=STATEF(libpath||dirs.num'/.'STRIP(LEFT(dirs.num,15)))
  1005.   IF finfo='' THEN liblist=liblist num
  1006. END
  1007. CALL CLOSE(f)
  1008. liblist=STRIP(liblist)
  1009. DO j=1 TO WORDS(liblist)
  1010.   tt=WORD(liblist,j)
  1011.   CALL MAKEDIR(libpath||dirs.tt)
  1012.   lf=libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15))
  1013.   flg='W'
  1014.   IF EXISTS(libpath||dirs.tt'.txt') THEN
  1015.     DO
  1016.       ADDRESS COMMAND 'COPY' libpath||dirs.tt'.txt' lf
  1017.       flg='A'
  1018.     END
  1019.   IF ~listOPEN(f,lf,flg) THEN ITERATE j
  1020.   IF flg='A' THEN CALL WRITELN(f,'')
  1021.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  1022.   CALL WRITELN(f,LEFT('=',77,'='))
  1023.   CALL CLOSE(f)
  1024. END
  1025. RETURN
  1026.  
  1027.  
  1028. updateliblists:
  1029. PARSE ARG ln 
  1030. x=FIND(liblist,WORD(ln,4))
  1031. IF x=0 THEN RETURN
  1032. tt=WORD(liblist,x)
  1033. IF tt~=lastlib THEN
  1034.   DO
  1035.     CALL CLOSE(b)
  1036.     lastlib=tt
  1037.     x=OPEN(b,libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)),'A')
  1038.     IF x=0 THEN
  1039.       DO
  1040.         lastlib=0
  1041.         RETURN
  1042.       END
  1043.   END
  1044. CALL WRITELN(b,ln)
  1045. cnt.tt=cnt.tt+1
  1046. RETURN
  1047.  
  1048.  
  1049. closeliblists:
  1050. CALL CLOSE(b)
  1051. DO i=1 TO WORDS(liblist)
  1052.   tt=WORD(liblist,i)
  1053.   dname='.'STRIP(LEFT(dirs.tt,15))
  1054.   SAY ' 'dname
  1055.   x=OPEN(f,libpath||dirs.tt'/'dname,'A')
  1056.   IF x~=0 THEN
  1057.     DO
  1058.       CALL WRITELN(f,LEFT('-',77,'-'))
  1059.       temp='file'
  1060.       IF cnt.tt>1 THEN temp=temp's'
  1061.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  1062.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  1063.       CALL WRITELN(f,temp)
  1064.       CALL CLOSE(f)
  1065.     END
  1066.   CALL MAKEDIR(bbspath'FileNotes/'dirs.tt)
  1067.   fnote=bbspath'FileNotes/'dirs.tt'/'dname
  1068.   lynes.=''
  1069.   lynes.0=5
  1070.   x=OPEN(f,fnote,'R')
  1071.   IF x~=0 THEN
  1072.     DO
  1073.       DO k=1
  1074.         line=READLN(f)
  1075.         IF EOF(f) THEN LEAVE k
  1076.         lynes.k=line
  1077.       END
  1078.       CALL CLOSE(f)
  1079.       lynes.0=k-1
  1080.     END
  1081.   finfo=STATEF(libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)))
  1082.   bt=WORD(finfo,2)
  1083.   dl=WORD(lynes.2,7)
  1084.   IF ~DATATYPE(dl,'W') THEN dl=0
  1085.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  1086.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  1087.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'dirs.tt
  1088.   lynes.4=LEFT('',74,'=')
  1089.   IF lynes.5='' THEN
  1090.     lynes.5='Up to the minute alphabetical filelist of the' dirs.tt 'library.'
  1091.   IF writeopen(fnote) THEN
  1092.     DO
  1093.       DO k=1 TO lynes.0
  1094.         CALL WRITELN(f,lynes.k)
  1095.       END
  1096.       CALL CLOSE(f)
  1097.       SAY LEFT(' ',LENGTH(dname)+2)'1B'x'Mupdated.'
  1098.     END
  1099. END
  1100. RETURN
  1101.  
  1102.  
  1103. browse:
  1104. IF files.0=0 THEN CALL loadfiles()
  1105. arg=''
  1106. curdironly=0
  1107. brdir=PRAGMA('D')
  1108. brfilenum=1
  1109. nonstop=0
  1110. IF files.0<1 THEN RETURN
  1111. lastfile=countcheck('Numbers/LastFile' 0)
  1112. IF lastfile<1 THEN RETURN
  1113. onearg=0
  1114. IF arg='' THEN
  1115.   DO
  1116.     lin='Browsing'
  1117.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  1118.     IF test='Y' THEN
  1119.       DO
  1120.         IF chdir()>0 THEN RETURN
  1121.         curdironly=1
  1122.         lin=lin 'the' pen3||plaindir||def 'library'
  1123.         t=libpath||plaindir'.txt'
  1124.         IF edinfo(t,plaindir,'File Library') THEN RETURN
  1125.       END
  1126.     ELSE lin=lin 'all file libraries'
  1127.     lin=lin 'backwards from latest file.'
  1128.     SAY lin
  1129.     SAY
  1130.   END
  1131. ELSE onearg=1
  1132. i=0
  1133. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  1134.   DO lastfileloop=1
  1135.     IF lastfile<1 THEN RETURN
  1136.     arg=WORD(files.lastfile,2)
  1137.     brfilenum=lastfile
  1138.     IF WORD(files.lastfile,2)~='' THEN LEAVE lastfileloop
  1139.     lastfile=lastfile-1
  1140.   END
  1141. ELSE IF DATATYPE(arg,'W') THEN
  1142.   DO
  1143.     brfilenum=arg
  1144.     arg=WORD(files.arg,2)
  1145.     IF arg='' THEN
  1146.       DO
  1147.         SAY 'File number' brfilenum 'does not exist in the current libraries!'
  1148.         RETURN
  1149.       END
  1150.   END
  1151. ELSE
  1152.   DO
  1153.     IF onearg THEN CALL busywait(4 1)
  1154.     DO ni=lastfile TO 1 BY -1
  1155.       IF onearg THEN CALL busywait(60 ni lastfile)
  1156.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  1157.       brfilenum=ni
  1158.       CALL busywait(4 0)
  1159.       LEAVE ni
  1160.     END
  1161.     IF ni<1 THEN
  1162.       DO
  1163.         SAY 'Unable to find a file description for' pen3||arg||def'.'
  1164.         RETURN
  1165.       END
  1166.   END
  1167. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  1168. savearg=arg
  1169. IF brfilenum>lastfile THEN brfilenum=lastfile
  1170. newfilesdate=DATE('S') TIME()
  1171. DO browseloop=1
  1172.   IF curdironly THEN CALL busywait(4 1)
  1173.   DO ni=brfilenum TO 0 BY -1
  1174.     IF ni=0 THEN LEAVE browseloop
  1175.     IF files.ni='' THEN ITERATE ni
  1176.     IF onearg THEN
  1177.       DO
  1178.         CALL busywait(60 ni lastfile)
  1179.         IF UPPER(arg)~=UPPER(WORD(files.ni,2)) THEN ITERATE ni
  1180.         IF (ni//30)>0 THEN CALL busywait(4 1)
  1181.         LEAVE ni
  1182.       END
  1183.     testdir=UPPER(WORD(files.ni,1))
  1184.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  1185.       DO
  1186.         IF ni>lastbrowse THEN lastbrowse=ni
  1187.         IF ni>0 THEN CALL busywait(60 ni lastfile)
  1188.         ITERATE ni
  1189.       END
  1190.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  1191.       DO
  1192.         IF ni>lastbrowse THEN lastbrowse=ni
  1193.         ITERATE ni
  1194.       END
  1195.     LEAVE ni
  1196.   END
  1197.   IF curdironly | onearg THEN CALL busywait(4 0)
  1198.   onearg=0
  1199.   IF ni=0 THEN brfilenum=lastbrowse
  1200.   ELSE brfilenum=ni
  1201.   argname=WORD(files.brfilenum,2)
  1202.   IF argname='' THEN RETURN
  1203.   CALL setdir(libpath||WORD(files.brfilenum,1))
  1204.   arg=bbspath'FileNotes/'plaindir'/'argname
  1205.   CALL readlines(arg 1)
  1206.   IF nonstop=1 THEN brostop=1
  1207.   ELSE brostop=0
  1208.   CALL seelines(1)
  1209.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  1210.   IF brostop THEN
  1211.     DO
  1212.       SAY
  1213.       nonstop=1
  1214.       brfilenum=brfilenum-1
  1215.     END
  1216.   ELSE
  1217.     DO
  1218.       line=''
  1219.       endtest=UPPER(RIGHT(argname,4))
  1220.       line=''
  1221.       IF FIND('.ARC .ARJ .DMS .LZH .LHA .RUN .ZIP .ZOO',endtest)>0 THEN
  1222.         line='['pen3'C'def']ontents '
  1223.       line=line'['pen3'D'def']ownload '
  1224.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1225.         line=line'['pen3'E'def']dit'
  1226.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1227.         line=line '['pen3'K'def']ill'
  1228.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  1229.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  1230.       IF endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15))) THEN
  1231.         line=line '['pen3'R'def']ead'
  1232.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  1233.       brcom=getinput(1 0 line)
  1234.       IF DATATYPE(brcom,'W') THEN
  1235.         DO
  1236.           brfilenum=brcom+1
  1237.           IF brfilenum>lastfile THEN brfilenum=lastfile+1
  1238.           IF brfilenum<1 THEN brfilenum=1
  1239.           SAY
  1240.         END
  1241.       ELSE brcom=LEFT(brcom,1)
  1242.       CALL cleanline(0)
  1243.       IF brcom='Q' THEN LEAVE browseloop
  1244.       IF brcom='M' THEN
  1245.         DO
  1246.           wordnum=FIND(dlist,brfilenum)
  1247.           IF wordnum=0 THEN
  1248.             DO
  1249.               dlist=STRIP(dlist brfilenum)
  1250.               SAY lineup||argname 'marked to copy later.'
  1251.               SAY
  1252.             END
  1253.           ELSE
  1254.             DO
  1255.               dlist=STRIP(DELWORD(dlist,wordnum,1))
  1256.               SAY argname 'removed from copy list.'
  1257.             END
  1258.         END
  1259.       IF brcom='H' | brcom='?' THEN
  1260.         DO
  1261.           SAY pen3' - HELP with the Browse Files commands -'def
  1262.           SAY ' RETURN reads the next file description in line.'
  1263.           SAY ' 34 will display the description of file number 34, if it exists.'
  1264.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'
  1265.           SAY ' D  displays the download menu.'
  1266.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1267.             DO
  1268.           SAY ' E  puts this file description into the online Editor.'
  1269.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'
  1270.             END
  1271.           IF level>sysoplevel THEN
  1272.           SAY ' L  move file and description to new Library and/or rename.'
  1273.           SAY ' M  mark/unmark the current file for the next download'
  1274.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'
  1275.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'
  1276.           SAY ' Q  returns to the main menu(s). (Quit)'
  1277.           SAY
  1278.           CALL waiting()
  1279.           IF waitchar='Q' THEN LEAVE browseloop
  1280.         END
  1281.       ELSE IF brcom='L' & level>sysoplevel THEN
  1282.         DO
  1283.           curdir=PRAGMA('D')
  1284.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  1285.             DO
  1286.               newarg=getinput(0 0 'Rename' argname 'to ')
  1287.               IF newarg~='' THEN
  1288.                 DO
  1289.                   IF is_here(newarg) THEN ITERATE browseloop
  1290.                   IF wi=999999 THEN ITERATE browseloop
  1291.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  1292.                     DO
  1293.                       SAY
  1294.                       SAY '***' newarg 'already exists!'
  1295.                       SAY
  1296.                       ITERATE browseloop
  1297.                     END
  1298.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  1299.                   IF junk='Y' THEN
  1300.                     DO
  1301.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  1302.                       comment=WORD(STATEF(arg),8)
  1303.                       CALL DELETE(arg)
  1304.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  1305.                       CALL savelines(arg)
  1306.                       IF comment='' THEN
  1307.                         DO
  1308.                           mpath=libpath||plaindir
  1309.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  1310.                             SAY 'Rename failed on main file!'
  1311.                         END
  1312.                       ELSE
  1313.                         DO
  1314.                           t=LASTPOS('/',comment)
  1315.                           IF t=0 THEN t=LASTPOS(':',comment)
  1316.                           mpath=LEFT(comment,t-1)
  1317.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  1318.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  1319.                           ELSE SAY 'Rename failed on external file!'
  1320.                         END
  1321.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  1322.                       keywords=STRIP(SUBSTR(lynes.1,23))
  1323.                       CALL addfile()
  1324.                       argname=newarg
  1325.                       savefileflag=1
  1326.                       CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  1327.                     END
  1328.                 END
  1329.             END
  1330.           IF getinput(1 1 'Move' argname '? (Ny) > ')='Y' THEN
  1331.             DO
  1332.               IF chdir()=0 THEN
  1333.                 DO
  1334.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  1335.                     DO
  1336.                       CALL readlines(arg 1)
  1337.                       CALL movefile(brfilenum dirs.dirnum)
  1338.                     END
  1339.                 END
  1340.             END
  1341.           CALL setdir(curdir)
  1342.         END
  1343.       ELSE IF brcom='N' THEN
  1344.         DO
  1345.           brfilenum=brfilenum-1
  1346.           nonstop=1
  1347.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def
  1348.           SAY
  1349.           CALL DELAY(99)
  1350.           brcom=''
  1351.         END
  1352.       ELSE IF brcom='C' THEN
  1353.         DO
  1354.           temp=STRIP(WORD(STATEF(arg),8))
  1355.           IF temp='' THEN temp=libpath||plaindir'/'argname
  1356.           CALL Contents.rexx(temp)
  1357.           IF EXISTS('RAM:CONTENTS') THEN
  1358.             DO
  1359.               CALL cleanline(1)
  1360.               CALL readlines('RAM:CONTENTS' 1)
  1361.               CALL seelines(0)
  1362.               IF waitchar~='Q' THEN CALL waiting()
  1363.               nonstop=0
  1364.             END
  1365.           ELSE SAY pen3'Not an archived file.'def
  1366.         END
  1367.       ELSE IF brcom='D' THEN
  1368.         DO
  1369.           IF pickdir() THEN CALL copyfile(brfilenum)
  1370.         END
  1371.       ELSE IF brcom='E' THEN
  1372.         DO
  1373.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1374.             DO
  1375.               firstedit=5
  1376.               IF level>sysoplevel THEN firstedit=1
  1377.               CALL bbsEd.rexx(firstedit arg name)
  1378.               CALL readlines(arg 1)
  1379.               CALL checkfilechanges()
  1380.             END
  1381.         END
  1382.       ELSE IF brcom='K' THEN
  1383.         DO
  1384.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  1385.             DO
  1386.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  1387.                 DO
  1388.                   tempnum=WORD(lynes.1,2)
  1389.                   IF tempnum=lastfile THEN
  1390.                     DO
  1391.                       CALL DELETE(bbspath'Numbers/LastFile')
  1392.                       CALL DELAY(28)
  1393.                       lastfile=lastfile-1
  1394.                       CALL countcheck('Numbers/LastFile' lastfile)
  1395.                     END
  1396.                   files.tempnum=''
  1397.                   savefileflag=1
  1398.                   finfo=STATEF(arg)
  1399.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  1400.                   CALL DELETE(argname)
  1401.                   CALL DELETE(arg)
  1402.                   SAY argname pen3'has been deleted.'def
  1403.                   CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  1404.                 END
  1405.             END
  1406.         END
  1407.       ELSE IF brcom='R' & (endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15)))) THEN
  1408.         DO
  1409.           vcount=WORD(lynes.2,7)+1
  1410.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  1411.           edtype=''
  1412.           CALL savelines(arg)
  1413.           CALL showtext(argname)
  1414.         END
  1415.       ELSE brfilenum=brfilenum-1
  1416.     END
  1417. END
  1418. CALL setdir(brdir)
  1419. waitchar=''
  1420. IF nonstop THEN CALL waiting()
  1421. nonstop=0
  1422. CALL savedata(0)
  1423. RETURN
  1424.  
  1425.  
  1426. pickdir:
  1427. topath=GETCLIP('BBS_topath')
  1428. IF topath='' THEN topath=GETCLIP('BBS_frompath')
  1429. todir=GetFile(150,36,topath,'',' Destination ',,'NOFILES')
  1430. IF RIGHT(todir,1)='/' THEN todir=LEFT(todir,LENGTH(todir)-1)
  1431. IF WORD(STATEF(todir),1)='DIR' THEN
  1432.   DO
  1433.     IF todir~=topath THEN CALL SETCLIP('BBS_topath',todir)
  1434.     RETURN 1
  1435.   END
  1436. ELSE SAY pen3'*'def||todir||pen3'* is not a valid directory!'def
  1437. RETURN 0
  1438.  
  1439.  
  1440. copyfile:
  1441. ARG fnum .
  1442. copyarg=libpath||SPACE(files.fnum,'/',' ')
  1443. fname=WORD(files.num,2)
  1444. finfo=STATEF(arg)
  1445. IF WORDS(finfo)>7 THEN copyarg=WORD(finfo,8)
  1446. SAY 'Copying' fname 'to' todir'...'
  1447. ADDRESS COMMAND 'COPY' copyarg todir 'CLONE'
  1448. RETURN
  1449.  
  1450.  
  1451. movefile:
  1452. PARSE ARG fnum movdir .
  1453. savefileflag=1
  1454. fromdir=STRIP(WORD(files.fnum,1))
  1455. farg=STRIP(WORD(files.fnum,2))
  1456. md=libpath||movdir
  1457. mf=md'/'farg
  1458. fd=libpath||fromdir
  1459. ff=fd'/'farg
  1460. CALL DELETE(md'/.'STRIP(LEFT(movdir,15)))
  1461. CALL DELETE(fd'/.'STRIP(LEFT(fromdir,15)))
  1462. fn=bbspath'FileNotes/'fromdir'/'farg
  1463. commen=WORD(STATEF(fn),8)
  1464. IF commen~='' THEN
  1465.   DO
  1466.     ff=commen
  1467.     n=LASTPOS('/',ff)
  1468.     IF n>1 THEN
  1469.       DO
  1470.         xf=SUBSTR(ff,n+1)
  1471.         tfd=LEFT(ff,n-1)
  1472.         n=LASTPOS('/',tfd)
  1473.         IF n=0 THEN n=LASTPOS(':',tfd)
  1474.         IF n>0 THEN
  1475.           DO
  1476.             tmd=LEFT(tfd,n)||movdir
  1477.             SAY 'Rename external file'pen3 ff||def
  1478.             IF getinput(1 1 '                  to'pen3 tmd'/'farg||def'? (Ny) > ')='Y' THEN
  1479.               DO
  1480.                 fd=tfd
  1481.                 md=tmd
  1482.                 mf=md'/'farg
  1483.                 commen=md'/'xf
  1484.               END
  1485.             ELSE IF getinput(1 1 '          or move to'pen3 mf||def'? (Ny) > ')='Y' THEN
  1486.               DO
  1487.                 fd=tfd
  1488.                 commen=''
  1489.               END
  1490.           END
  1491.       END
  1492.   END
  1493. CALL MAKEDIR(md)
  1494. IF RENAME(ff,mf)=0 THEN
  1495.   DO
  1496.     ADDRESS COMMAND 'C:COPY' ff mf
  1497.     IF EXISTS(mf) THEN
  1498.       IF DELETE(ff)~=1 THEN SAY pen3'Unable to delete'def ff||pen3'.'def
  1499.   END
  1500. files.fnum=movdir farg
  1501. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  1502. lynes.3=STRIP(lynes.3) movdir
  1503. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  1504. mn=bbspath'FileNotes/'movdir'/'farg
  1505. CALL savelines(mn)
  1506. IF EXISTS(mn) THEN
  1507.   DO
  1508.     CALL DELETE(fn)
  1509.     comm='C:FileNote' mn
  1510.     IF commen~='' THEN comm=comm commen
  1511.     ADDRESS COMMAND comm
  1512.   END
  1513. keywords=STRIP(SUBSTR(lynes.1,23))
  1514. CALL addfile()
  1515. SAY 'Moved:' fromdir'/'farg 'to' movdir
  1516. RETURN
  1517.  
  1518.  
  1519. savedata:
  1520. SAY 'Updating...             'lineup
  1521. IF lastbrowse~=WORD(data.16,1) THEN data.16=lastbrowse DATE('S') TIME()
  1522. IF ~writeopen(bbspath'USERS/'name) THEN RETURN
  1523. IF data.0<27 THEN data.0=27
  1524. DO i=1 TO data.0
  1525.   CALL WRITELN(f,data.i)
  1526. END
  1527. CALL CLOSE(f)
  1528. SAY 'User' name 'has been updated.'
  1529. RETURN
  1530.  
  1531.  
  1532. loaddata:
  1533. IF name='' THEN RETURN 0
  1534. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  1535. data.=''
  1536. DO i=1
  1537.   line=READLN(f)
  1538.   IF EOF(f) THEN BREAK
  1539.   data.i=line
  1540. END
  1541. data.0=i-1
  1542. CALL CLOSE(f)
  1543. lastbrowse=WORD(data.16,1)
  1544. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  1545. level=data.20
  1546. password=data.5
  1547. linesperpage=20
  1548. colorflag=1
  1549. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  1550. ELSE clr=''
  1551. RETURN 1
  1552.  
  1553.  
  1554. loadfiles:
  1555. SAY def
  1556. IF ~listOPEN(f,bbspath'Lists/Files','R') THEN RETURN
  1557. SAY 'Loading filelist...'
  1558. files.=''
  1559. files.0=0
  1560. DO i=1
  1561.   line=READLN(f)
  1562.   IF EOF(f) THEN BREAK
  1563.   num=WORD(line,1)
  1564.   IF DATATYPE(num,'W') THEN files.num=WORD(line,2) WORD(line,3)
  1565. END
  1566. files.0=i-1
  1567. CALL CLOSE(f)
  1568. RETURN
  1569.  
  1570.  
  1571. checkfilechanges:
  1572. t=GETCLIP('BBS_FileChangeLOCAL')
  1573. IF t='' THEN RETURN
  1574. CALL SETCLIP('BBS_FileChangeLOCAL')
  1575. tn=WORDS(t)
  1576. IF tn>1 THEN
  1577.   DO
  1578.     fnum=WORD(t,tn)%1
  1579.     t=STRIP(DELWORD(t,tn,1))
  1580.     CALL SETCLIP('BBS_FileChangeLOCAL',t)
  1581.   END
  1582. ELSE fnum=t%1
  1583. keywords=GETCLIP('BBS_Keywords_'fnum)
  1584. CALL SETCLIP('BBS_Keywords_'fnum)
  1585. CALL addfile()
  1586. RETURN
  1587.  
  1588.  
  1589. addfile:
  1590. filenum=WORD(lynes.1,2)
  1591. num=0
  1592. DO ii=1 TO newlist.0
  1593.   IF WORD(newlist.ii,3)=filenum THEN num=ii
  1594. END
  1595. IF num=0 THEN
  1596.   DO
  1597.     num=newlist.0+1
  1598.     newlist.0=num
  1599.   END
  1600. libnum=finddirnum(WORD(lynes.3,9))
  1601. newlist.num=LEFT(WORD(lynes.2,2),22-LENGTH(WORD(lynes.2,4)))
  1602. newlist.num=newlist.num WORD(lynes.2,4) RIGHT(filenum,5)
  1603. newlist.num=newlist.num RIGHT(libnum,2) LEFT(WORD(files.filenum,1),12)
  1604. newlist.num=newlist.num STRIP(LEFT(keywords,32))
  1605. IF FIND(numlist,filenum)=0 THEN numlist=filenum numlist
  1606. RETURN
  1607.  
  1608.  
  1609. edinfo:
  1610. PARSE ARG t1,t2,t3
  1611. IF level<sysoplevel THEN RETURN 0
  1612. IF getinput(1 1 'Edit the'pen3 t2 def||t3 'info file? (Ny) > ')='Y' THEN
  1613.   DO
  1614.     IF ~EXISTS(t) THEN
  1615.       DO
  1616.         IF writeopen(t1) THEN
  1617.           DO
  1618.             CALL WRITELN(f,TRIM(CENTER('***'pen3 t2 def||t3 '***',75)))
  1619.             CALL WRITELN(f,LEFT('',75,'='))
  1620.             CALL CLOSE(f)
  1621.             CALL DELAY(28)
  1622.           END
  1623.       END
  1624.     CALL bbsEd.rexx(1 t1 name)
  1625.     RETURN 1
  1626.   END
  1627. RETURN 0
  1628.  
  1629.  
  1630. busywait:
  1631. ARG bii bi bt 
  1632. IF bi<1 THEN
  1633.   DO
  1634.     CALL WRITECH(STDOUT,'080808'x)
  1635.     IF ni<1 & i>999998 & wi>999998 THEN SAY
  1636.     RETURN
  1637.   END
  1638. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  1639. IF bi//(bii%2)~=0 THEN RETURN
  1640. b=bi//bii
  1641. IF b=0 | b=bii%2 THEN
  1642.   DO
  1643.     tp=RIGHT((bi*100)%bt,2)'%'
  1644.     CALL WRITECH(STDOUT,'080808'x||tp)
  1645.   END
  1646. RETURN
  1647.  
  1648.  
  1649. BREAK_E:
  1650. i=999999
  1651. ri=999999
  1652. wi=999999
  1653. RETURN
  1654.  
  1655.  
  1656. BREAK_C:
  1657. EXIT
  1658.  
  1659. /* bbsFile.rexx */
  1660.